package es.armaplus.struts.actions.presupuestos;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import es.armaplus.business.BusinessFactory;
import es.armaplus.business.PresupuestoBusiness;
import es.armaplus.commons.Constantes;
import es.armaplus.ddbb.base.PresupuestoEntrada;
import es.armaplus.ddbb.base.Presupuestos;
import es.armaplus.struts.actions.BaseAction;
import es.armaplus.struts.forms.presupuestos.PresupuestosForm;

/**
 * Acci�n PRE-carga al formulario de alta del presupuesto.
 * @author Texaco
 *
 */
public class AltaPresupuestoDo extends BaseAction {

	private static final Log log = LogFactory.getLog(AltaPresupuestoDo.class);
	private static final String DESCRIPCION = "descripcion";
	private static final String CANTIDAD = "cantidad";
	private static final String PRECIO_UNIDAD= "precioUnidad";

	
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		log.debug(Constantes.METHOD_BEGIN);
		
		/*
		 * Debemos de recoger los campos formados dinamicamente de entradas
		 * de presupuestos y guardarlos.
		 */
		PresupuestosForm presupuestoF = (PresupuestosForm) form;
		
		Collection coleccionEntradasPresupuesto = recogerEntradasPresupuesto(request);
		PresupuestoBusiness presupuestoB = (PresupuestoBusiness) 
			BusinessFactory.getBusiness(BusinessFactory.PRESUPUESTO_BUSINESS);
		
//		log.debug("Identificador del cliente: " + presupuestoF.getIdCliente());
		log.debug("Identificador del presupuesto: " + presupuestoF.getIdPresupuesto());
		Presupuestos presupuesto = presupuestoB.crearOActualizarPresupuesto(
				presupuestoF.getIdPresupuesto(), 
				presupuestoF.getIdCliente(), 
				presupuestoF.getDescuento(),
				presupuestoF.getImpuesto(), 
				coleccionEntradasPresupuesto);
	
		presupuestoF.setTotal(presupuestoB.getTotalImpDescInc(presupuesto));
		presupuestoF.setPresupuesto(presupuesto);
		
		log.debug(Constantes.METHOD_END);
		return mapping.findForward(Constantes.FORWARD_SUCCESS);
	}

	/**
	 * M�todo que nos permite obtener los campos de las entradas del presupuesto
	 * y delvolverlo de forma ordenada, para un posterior postproceso.
	 * 
	 * @param request
	 * @return
	 */
	private Collection recogerEntradasPresupuesto(HttpServletRequest request) {
		List <PresupuestoEntrada> entradasPresupuesto = 
			new ArrayList<PresupuestoEntrada>();
		


		int i = 0;
		while (true) {
			PresupuestoEntrada entrada = recuperarRegistro(i, request);
			if(entrada == null){
				break;
			}
			entradasPresupuesto.add(entrada);
			i++;
		}
		return entradasPresupuesto;
	}

	/**
	 * M�todo que devuelve la entrada i del presupuesto
	 * 
	 * @param i
	 * @param request
	 * @return
	 */
	private PresupuestoEntrada recuperarRegistro(int i,
			HttpServletRequest request) {

		PresupuestoEntrada entrada = null;
		
		if(request.getParameter(DESCRIPCION + i) != null &&
				!request.getParameter(DESCRIPCION + i).equals("") &&
				request.getParameter(CANTIDAD + i) != null &&
				!request.getParameter(CANTIDAD + i).equals("") && 
				request.getParameter(PRECIO_UNIDAD + i) != null &&
				!request.getParameter(PRECIO_UNIDAD + i).equals("")){
			entrada = new PresupuestoEntrada();
			entrada.setDescripcion(request.getParameter(DESCRIPCION + i));
			entrada.setCantidad(Integer.valueOf(request.getParameter(CANTIDAD + i)));
			entrada.setPrecioUnidad(Double.valueOf(request.getParameter(PRECIO_UNIDAD + i)));
		}
		return entrada;
	}

	
}
